package business;


import java.util.Vector;

public class InterseccionPoligonos {

	private Poligono poligonoInterseccion;
	private ConvexHull cv = new ConvexHull();
	
	public Poligono calcuarInserseccionPoligonos (Vector<Punto> p1, Vector<Punto> p2){
		
		Vector<Punto> puntosInternos = new Vector<Punto>();
		Vector<Punto> puntos = new Vector<Punto>();
		Poligono poligono1 = cv.calcularPoligonoConvexo(p1);
		Poligono poligono2 = cv.calcularPoligonoConvexo(p2);
		
		for (int i=0; i<p2.size(); i++ ){
			
			puntos.clear();
			
			for (int k=0;k<p1.size();k++)
			{
				puntos.add(p1.get(k));
			}
						
			puntos.add(p2.get(i));
			cv.calcularPoligonoConvexo(puntos);
			if (cv.getPuntosEliminados().size()>0)
				for (int j=0; j< cv.getPuntosEliminados().size(); j++)
					if (cv.getPuntosEliminados().get(j).equals(p2.get(i)))
						puntosInternos.add(p2.get(i));	

		}
				
		for (int i=0; i<p1.size(); i++ ){
			
			puntos.clear();
			
			for (int k=0;k<p2.size();k++)
			{
				puntos.add(p2.get(k));
			}
			puntos.add(p1.get(i));
			cv.calcularPoligonoConvexo(puntos);
			if (cv.getPuntosEliminados().size()>0)
				for (int j=0; j < cv.getPuntosEliminados().size(); j++)
					if (cv.getPuntosEliminados().get(j).equals(p1.get(i)))
						puntosInternos.add(p1.get(i));			
		}
		
		puntos.clear();
		
		puntos = calcularInterseccionesPoligono(poligono1,poligono2);
		for (int j=0; j < puntos.size(); j++)
			puntosInternos.add(puntos.get(j));
		
		poligonoInterseccion = cv.calcularPoligonoConvexo(puntosInternos);
		
		return poligonoInterseccion;
	}
	
    private Poligono crearPoligono (Vector<Punto> puntos){
    	
    	Poligono poligono = new Poligono();
    	
    	Vector<Linea> linea = new Vector<Linea>();
    	for (int i = 0; i<puntos.size(); i++)
    	{
    		if (i<puntos.size()-1)
    			linea.add(new Linea(puntos.get(i),puntos.get(i+1)));
    		else
    			linea.add(new Linea(puntos.get(i),puntos.get(0)));
    	}
    	
    	poligono.setLineas(linea);
    	
    	return poligono;
    }
    
    public Vector<Punto> calcularInterseccionesPoligono (Poligono p1, Poligono p2){
    	Vector<Punto> intersecciones = new Vector<Punto>();
    	Punto p = new Punto();
    	for (int i = 0; i < p1.getLineas().size(); i++){
    		for (int j = 0; j < p2.getLineas().size(); j++){
    			p = calcularIntersectionSegmento(p1.getLineas().get(i), p2.getLineas().get(j));
    			if (p != null && intersecciones.contains(p) == false){
    				intersecciones.add(p);
    			}
    		}
    	}
    	
    	return intersecciones;
    }
    
	public Punto calcularIntersectionSegmento(Linea l1, Linea l2)
	{
		double x1 = l1.getPuntoi().getCoordenadaX();
		double y1 = l1.getPuntoi().getCoordenadaY();
		double x2 = l1.getPuntof().getCoordenadaX();
		double y2 = l1.getPuntof().getCoordenadaY();
		
		double x3 = l2.getPuntoi().getCoordenadaX();
		double y3 = l2.getPuntoi().getCoordenadaY();
		double x4 = l2.getPuntof().getCoordenadaX();
		double y4 = l2.getPuntof().getCoordenadaY();
		
			double d = (x1-x2)*(y3-y4) - (y1-y2)*(x3-x4);
			if (d == 0) return null;
			
			double xi = ((x3-x4)*(x1*y2-y1*x2)-(x1-x2)*(x3*y4-y3*x4))/d;
			double yi = ((y3-y4)*(x1*y2-y1*x2)-(y1-y2)*(x3*y4-y3*x4))/d;
			
			Punto p = new Punto(xi,yi,0);
			
			if (xi <= Math.min(x1,x2) || xi >= Math.max(x1,x2)) return null;
			if (xi <= Math.min(x3,x4) || xi >= Math.max(x3,x4)) return null;
			if (yi <= Math.min(y1,y2) || yi >= Math.max(y1,y2)) return null;
			if (yi <= Math.min(y3,y4) || yi >= Math.max(y3,y4)) return null;
			return p;
		}
}